package cn.itcast.service.system.impl;

import cn.itcast.dao.system.UserDao;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.UserService;
import cn.itcast.utils.MailUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private AmqpTemplate amqpTemplate;

    @Override
    public List<User> findAll(String companyId) {
        return userDao.findAll(companyId);
    }

    @Override
    public void save(User user) {
//        String password = user.getPassword();  // 明文的
        String randomPassword  = RandomStringUtils.randomNumeric(6);  //随机生成6位的数字
//        密码加密   p1: source原密码  p2: salt盐  p3:散次列 加几次盐 如果这个数超过10 效率会低很多
        String password = new Md5Hash(randomPassword,user.getEmail(),2).toString();
        user.setPassword(password);
//        b9624cad1a4c522e9d458f42c6c6183f     https://www.cmd5.com/
        userDao.save(user);
//        应该给user发一个邮件 把密码放到邮件中
        try {
//            MailUtil.sendMsg(user.getEmail() , "恭喜您成为SaaS货代云平台的用户", "XXXXX,您的登录密码是："+randomPassword);
//            把发送邮件的任务先放入到mq中
//            收件人 主题  内容
            Map<String,String> map = new HashMap<>();
            map.put("to",user.getEmail());
            map.put("subject","恭喜您成为SaaS货代云平台的用户");
            map.put("content","XXXXX,您的登录密码是："+randomPassword);
            amqpTemplate.convertAndSend("mail.send",map);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public User findById(String id) {
        return userDao.findById(id);
    }

    @Override
    public void update(User user) {
        String password = user.getPassword();  // 明文的
//        密码加密   p1: source原密码  p2: salt盐  p3:散次列 加几次盐 如果这个数超过10 效率会低很多
        password = new Md5Hash(password,user.getEmail(),2).toString();
        user.setPassword(password);
        userDao.updateById(user);
    }

    @Override
    public void delete(String id) {
//        中间表中的数据删除  delete from pe_role_user where user_id=?

        userDao.deleteById(id);
    }

    @Override
    public PageInfo findPage(String companyId, int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List list = userDao.findAll(companyId);
        return new PageInfo(list,5);
    }

    @Override
    public void changeRole(String userid, String[] roleIds) {
//        先删除此用户下的角色

        userDao.deleteRoleAndUserByUserId(userid);

//       然后再新增
        for (String roleId : roleIds) {
            userDao.saveUserAndRole(userid,roleId);
        }

    }

    @Override
    public List<String> findRoleIdsByUserId(String userid) {
        return userDao.findRoleIdsByUserId(userid);
    }

    @Override
    public User findByEmail(String email) {
        return userDao.findByEmail(email);
    }

    public static void main(String[] args) {
        System.out.println(new Md5Hash("123456", "laowang@export.com", 2).toString());
        System.out.println(new Md5Hash("123456", "admin@export.com", 2).toString());
        System.out.println(new Md5Hash("123456", "xiaowang@export.com", 2).toString());
        System.out.println(new Md5Hash("123456", "laozhang@export.com").toString());
    }
}
